﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.Xml.Schema;
using System.IO;

namespace Browis.Utils
{
    

    [XmlRoot("SerializableDictionary")]
    public class SerializableDictionary<TKey, TValue>
        : Dictionary<TKey, TValue>, IXmlSerializable
    {
        public System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;
            /*
            StringBuilder sb = new StringBuilder();
            //sb.Append("<xs:schema id='SerializableDictionary' targetNamespace='http://www.browis2.com/xml/serialization' elementFormDefault='qualified' xmlns='http://www.browis2.com/xml/serialization' xmlns:mstns='http://www.browis2.com/xml/serialization' xmlns:xs='http://www.w3.org/2001/XMLSchema'>");
            sb.Append("<xs:schema id='SerializableDictionary' elementFormDefault='qualified' xmlns:xs='http://www.w3.org/2001/XMLSchema'>");
            sb.Append("<xs:complexType name='SerializableDictionary'>");
            sb.Append("<xs:sequence>");
            sb.Append("<xs:element name='Item' type='ItemType' maxOccurs='unbounded' />");
            sb.Append("</xs:sequence>");
            sb.Append("</xs:complexType>");
            sb.Append("<xs:complexType name='ItemType'>");
            sb.Append("<xs:sequence>");
            sb.Append("<xs:element name='Key' type='xs:string' />");
            sb.Append("<xs:element name='Value' type='xs:string' />");
            sb.Append("</xs:sequence>");
            sb.Append("</xs:complexType>");
            //sb.Append("<xs:element name='SerializableDictionary' type='mstns:SerializableDictionary'></xs:element></xs:schema>");
            sb.Append("<xs:element name='SerializableDictionary' type='SerializableDictionary'></xs:element></xs:schema>");

            return XmlSchema.Read(new StringReader(sb.ToString()), null);
             */
        }

        public void ReadXml(System.Xml.XmlReader reader)
        {
            XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));

            if (reader.IsEmptyElement || !reader.Read())
            {
                return;
            }

            while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
            {
                reader.ReadStartElement("Item");

                reader.ReadStartElement("Key");
                TKey key = (TKey)keySerializer.Deserialize(reader);
                reader.ReadEndElement();

                reader.ReadStartElement("Value");
                TValue value = (TValue)valueSerializer.Deserialize(reader);
                reader.ReadEndElement();

                this.Add(key, value);

                reader.ReadEndElement();
                reader.MoveToContent();
            }
            reader.ReadEndElement();
        }

        public void WriteXml(System.Xml.XmlWriter writer)
        {
            XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));

            foreach (TKey key in this.Keys)
            {
                writer.WriteStartElement("Item");

                writer.WriteStartElement("Key");
                keySerializer.Serialize(writer, key);
                writer.WriteEndElement();

                writer.WriteStartElement("Value");
                TValue value = this[key];
                valueSerializer.Serialize(writer, value);
                writer.WriteEndElement();

                writer.WriteEndElement();
            }
        }
    }
}
